package com.ruoyi.energy.service.impl;

import cn.hutool.core.util.IdUtil;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.SecurityUtils;
import com.ruoyi.energy.domain.NyMeterManagement;
import com.ruoyi.energy.mapper.NyCheckMeterMapper;
import com.ruoyi.energy.mapper.NyMeterAccountMapper;
import com.ruoyi.energy.mapper.NyMeterManagementMapper;
import com.ruoyi.energy.service.INyMeterManagementService;
import com.ruoyi.omp.api.domain.NyCheckMeter;
import com.ruoyi.omp.api.domain.NyMeterAccount;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 仪表管理Service业务层处理
 *
 * @author cjie
 * @date 2021-07-29
 */
@Service
public class NyMeterManagementServiceImpl implements INyMeterManagementService {
    @Autowired
    private NyMeterManagementMapper nyMeterManagementMapper;

    @Autowired
    private NyCheckMeterMapper nyCheckMeterMapper;

    @Autowired
    private NyMeterAccountMapper nyMeterAccountMapper;

    /**
     * 查询仪表管理
     *
     * @param id 仪表管理ID
     * @return 仪表管理
     */
    @Override
    public NyMeterManagement selectNyMeterManagementById(String id) {
        return nyMeterManagementMapper.selectNyMeterManagementById(id);
    }

    /**
     * 查询仪表管理列表
     *
     * @param nyMeterManagement 仪表管理
     * @return 仪表管理
     */
    @Override
    public List<NyMeterManagement> selectNyMeterManagementList(NyMeterManagement nyMeterManagement) {
        return nyMeterManagementMapper.selectNyMeterManagementList(nyMeterManagement);
    }

    /**
     * 新增仪表管理
     *
     * @param nyMeterManagement 仪表管理
     * @return 结果
     */
    @Override
    public int insertNyMeterManagement(NyMeterManagement nyMeterManagement) {
        nyMeterManagement.setId(IdUtil.getSnowflake(0, 0).nextIdStr());
        nyMeterManagement.setCreateTime(DateUtils.getNowDate());
        nyMeterManagement.setCreateBy(SecurityUtils.getUsername());
        return nyMeterManagementMapper.insertNyMeterManagement(nyMeterManagement);
    }

    /**
     * 修改仪表管理
     *
     * @param nyMeterManagement 仪表管理
     * @return 结果
     */
    @Override
    public int updateNyMeterManagement(NyMeterManagement nyMeterManagement) {
        nyMeterManagement.setUpdateTime(DateUtils.getNowDate());
        nyMeterManagement.setUpdateBy(SecurityUtils.getUsername());
        return nyMeterManagementMapper.updateNyMeterManagement(nyMeterManagement);
    }

    /**
     * 批量删除仪表管理
     *
     * @param ids 需要删除的仪表管理ID
     * @return 结果
     */
    @Override
    public int deleteNyMeterManagementByIds(String[] ids) {
        return nyMeterManagementMapper.deleteNyMeterManagementByIds(ids);
    }

    /**
     * 删除仪表管理信息
     *
     * @param id 仪表管理ID
     * @return 结果
     */
    @Override
    public int deleteNyMeterManagementById(String id) {
        return nyMeterManagementMapper.deleteNyMeterManagementById(id);
    }

    /*计算私表汇总量*/
    @Override
    public int computeNyMeterManagement(String id) {
        //汇总记录总表id
        NyMeterManagement nyMeterManagement = nyMeterManagementMapper.selectNyMeterManagementById(id);
        String meterId = nyMeterManagement.getMeterId();
        //查询总表下的考核表
        NyMeterAccount nyMeterAccount = new NyMeterAccount();
        nyMeterAccount.setParentId(meterId);
        List<NyMeterAccount> nyMeterAccounts1 = nyMeterAccountMapper.selectNyMeterAccountList(nyMeterAccount);

        //查询考核表下的私表
        List<String> nyMeterAccounts = nyMeterAccounts1.stream().map(NyMeterAccount::getId).collect(Collectors.toList());
        List<NyMeterAccount> privates = nyMeterAccountMapper.selectNyMeterAccountListByParentIds(nyMeterAccounts);

        //查询抄表记录，累积 实际用电量
        BigDecimal result = new BigDecimal("0");
        for(NyMeterAccount account:privates){
            String privateid = account.getId();
            NyCheckMeter nyCheckMeter = new NyCheckMeter();
            nyCheckMeter.setMeterId(privateid);
            nyCheckMeter.setFeeCycle(nyMeterManagement.getFeeCycle());
            List<NyCheckMeter> nyCheckMeters= nyCheckMeterMapper.selectNyCheckMeterList(nyCheckMeter);
            result = result.add(nyCheckMeters.get(0).getActualDosage());
        }

        //更新到数据库
        nyMeterManagement.setSummaryDosage(result);
        //差额
        //nyMeterManagement.setDiffDosage(nyMeterManagement.getActualDosage().subtract(result));
        //新增分摊量
        //nyMeterManagement.setAddShare(nyMeterManagement.getActualDosage().subtract(result));
        return nyMeterManagementMapper.updateNyMeterManagement(nyMeterManagement);
        //返回更新结果

    }

    /*计算分摊量*/
    @Override
    public int shareNyMeterManagement(String id) {
        // 计算分摊量
        //分摊系数
        BigDecimal C1 = null;
        //逻辑 分摊量为0，分摊量有意义，分摊量/私表总和
        //私表总和为0 or null,提示进行私表汇总
        //分摊系数*私表用量 ，更新到抄表记录
        NyMeterManagement nyMeterManagement = nyMeterManagementMapper.selectNyMeterManagementById(id);
        if(nyMeterManagement.getCurrentShare().compareTo(BigDecimal.ZERO) >0){
            if(nyMeterManagement.getSummaryDosage().compareTo(BigDecimal.ZERO)>0){
                C1 = nyMeterManagement.getCumulativeShare().divide(nyMeterManagement.getSummaryDosage());
            }else {
                //私表汇总量小于等于0
            }

        }else {
            //当前分摊量小于等于0
        }
        if(null != C1){
            nyMeterManagement.setShareFactor(C1);
            nyMeterManagementMapper.updateNyMeterManagement(nyMeterManagement);
            //更新抄表记录分摊量
            updateCheckMeterShare(nyMeterManagement);
        }
        return 0;
    }

    private void updateCheckMeterShare(NyMeterManagement multiply) {
        //查询总表下的考核表
        NyMeterAccount nyMeterAccount = new NyMeterAccount();
        nyMeterAccount.setParentId(multiply.getMeterId());
        List<NyMeterAccount> nyMeterAccounts = nyMeterAccountMapper.selectNyMeterAccountList(nyMeterAccount);

        //查询考核表下的私表
        List<String> assessIds = nyMeterAccounts.stream().map(NyMeterAccount::getId).collect(Collectors.toList());
        List<NyMeterAccount> privates = nyMeterAccountMapper.selectNyMeterAccountListByParentIds(assessIds);

        //更新抄表记录
        for(NyMeterAccount account:privates){
            String privateid = account.getId();
            NyCheckMeter nyCheckMeter = new NyCheckMeter();
            nyCheckMeter.setMeterId(privateid);
            nyCheckMeter.setFeeCycle(multiply.getFeeCycle());
            List<NyCheckMeter> nyCheckMeters= nyCheckMeterMapper.selectNyCheckMeterList(nyCheckMeter);
            nyCheckMeter = nyCheckMeters.get(0);
            //nyCheckMeter.setShareDosage(nyCheckMeter.getActualDosage().multiply(multiply.getShareFactor()));
            nyCheckMeterMapper.updateNyCheckMeter(nyCheckMeter);
        }
    }
}
